# Copyright 2013,2014 Dakota Simonds

#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

use warnings;
use strict;

sub EXIT_SUCCESS (){ #C style
	1;
}

sub TRUE (){ # you may occational have to use &TRUE or &FALSE
	1;
}

sub FALSE (){
	0;
}

sub forceflush{
	our $| = 1;
	
	return EXIT_SUCCESS;
}

sub savefile{ #savefile(filename, data);
	my $SVFL;
	
	open $SVFL, ">>", $_[0];
	syswrite $SVFL, $_[1];
	close $SVFL;
	
	return EXIT_SUCCESS;
}

sub assert{ #C style
	
	my @assertions = @_;
	
	foreach my $testAssertion (@assertions){
	
		if( not eval $testAssertion ){
		
			print "Assertion failure: '$testAssertion'\n";
			exit 0;
			
		} #else{ print "win\n"; }
		
	}
	
	return EXIT_SUCCESS;
}

sub prompt{
	my $question = shift;
	my $style = shift;
	my $styleOut;
	my $input;
	
	my %styles=(
		plain => "\x20",
		normal => ': ',
		yn => ' (y/n) ? ',
	);
	
	if($style eq ""){
		$styleOut = $styles{"plain"};
	}
	
	else{
		$styleOut = $styles{$style};
	}
	
	
	{ #these currlies makes redo work when input is not valid
	
		print $question, $styleOut;
		$input = <STDIN>;
		chomp $input;
		
		if(not $input =~ m/(y|n)/i and $style eq "yn"){
			print "\nThat is not a valid input!\n";
			redo;
		}
		
	}
	
	
	
	return $input;
}

sub strcat{
	my $compiled;
	
	for my $str (@_)
	{
	  $compiled = $compiled . $str;
	}
	
	return $compiled;
}

sub longCatIsLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonnngggggg{
	return '';
}


1;

__END__

=head1 NAME

    Spice

=head1 SYNOPSIS

    technically all these are functions but these three return
    true or false and take no arguments. meant to reduce magic
    numbers.
    
    EXIT_SUCCESS - C style return (true)
    TRUE         - returns 1
    FALSE        - returns 0

    forceflush   - same as $|=1
    savefile     - appends data to a file
    assert       - C style fuction. Like eval but if code reurns a false the program exits otherwise returns 1. takes a list.
    prompt       - get input in one line
    strcat       - a funtion the concatinates it's inputs
    savefile     - writes to a file in one line
	
=head1 DESCRIPTION

    Simple PERL module to that fixes small anoying things and provides a bit of C style funtionality

=head1 EXAMPLES

    forceflush;
    
    while( TRUE ){
    do something
    }
    
	savefile("meows.txt", "data");
	
    if($foobar == FALSE){
    do something
    }
    
	prompt("keywords","normal");
	prompt("do you want a cookie", "yn");
	prompt("do you want a cookie (Y/n)?", "plain");
	
    assert('$a=1');
    
    savefile($filename, $data);
    
    return EXIT_SUCCESS;

=cut
